Skip to main content

02. 数据模型

1. 数据模型概述

数据模型(Data Model)是数据库系统的核心,它提供了一种方法论,用于在数据库中模拟现实世界。每种数据库管理系统(DBMS)都实现了一种特定的数据模型。

2. 传统数据模型

2.1 层次数据模型(Hierarchical Data Model)

层次数据模型以树形结构来描述现实世界中的数据组织方式。

2.1.1 基本概念

  • 记录(Record)和字段(Field):构成数据模型的基本单元。
  • 父子关系(Parent-Child Relationship, PCR):层次模型中最基本的数据关系,表达的是两个记录类型之间 1:N 的关系。一个父记录可以有多个子记录,但一个子记录只能有一个父记录。

2.1.2 层次数据模式(Hierarchical Data Schema)

  • 由多个父子关系(PCRs)组成。
  • 每个PCR表示一个1:N关系。
  • 每个记录类型只能有一个父记录

2.1.3 虚拟记录(Virtual Record)

在现实世界中,许多数据并非严格的层次结构,例如:

  • M: N 关系:不同记录类型之间的多对多关系。
  • 多父记录:一个记录类型是多个PCR的子记录。
  • N元关系:涉及三个或更多记录类型的关系。

为了避免数据冗余并表达这些非层次关系,引入了虚拟记录。虚拟记录本质上是一个指针,它指向实际的数据,从而实现数据的共享和复杂关系的表达。

用例:

假设学生和课程之间存在M:N关系(一个学生可以选多门课,一门课可以被多个学生选)。在层次模型中,如果直接将课程作为学生的子记录,或者学生作为课程的子记录,都会导致数据冗余或无法表达完整关系。通过引入虚拟记录,可以创建一个指向学生记录的虚拟课程记录,或者指向课程记录的虚拟学生记录,从而避免冗余并表达M:N关系。

2.2 网状数据模型(Network Data Model)

网状数据模型突破了层次模型的限制,能够更灵活地表达非层次数据。

2.2.1 基本概念

  • 基本数据结构是“集”(Set):一个“集”代表现实世界中事物之间的 1:N 关系。
    • “1”的一方称为所有者(Owner)
    • “N”的一方称为成员(Member)
  • 一个记录类型可以是一个或多个“集”的所有者,也可以是一个或多个“集”的成员。
  • 多个“集”形成一个网状结构来表达现实世界。
  • 记录(Record)和数据项(Data Items):数据项类似于层次模型中的字段,但它可以是向量。
  • 链接记录类型(LINK record type):用于表达自关系(Self Relationship)、M:N关系和N元关系。

用例:

在学生和课程的M:N关系中,网状模型可以通过创建一个中间的“选课”链接记录类型来连接学生和课程记录。这个“选课”记录可以是学生“集”的成员,同时也是课程“集”的成员,从而清晰地表达了M:N关系,避免了数据冗余。

2.3 关系数据模型(Relational Data Model)

关系数据模型以“表”(Table)或“关系”(Relation)作为基本数据结构,将现实世界中的事物及其关系都表达为表。

2.3.1 特点

  • 基于集合论:具有高抽象级别。
  • 屏蔽底层细节:简单清晰,易于理解。
  • 可建立新的代数系统:关系代数(Relational Algebra)。
  • 非过程化查询语言:SQL(Structured Query Language)。
  • 软连接(Soft Link):与前两种数据模型的本质区别,通过共享属性(如主键和外键)来建立关系,而非物理指针。

2.3.2 核心概念

  • 属性(Attribute)和域(Domain)
    • 属性:实体特征的表达,如学生的姓名、学号等。
    • :属性值的取值范围。
    • 原子数据(Atomic Data):属性值不可再分,这是**第一范式(1NF)**的要求。
    • 空值(Null):表示属性值未知或不适用。
  • 关系(Relation)和元组(Tuple)
    • 关系:一个实体或实体集在关系模型中表示为一个或多个关系(表)。
    • 关系模式(Schema of Relation):关系R由属性A1, A2, ..., An及其对应的域D1, D2, ..., Dn定义,表示为 R = (A1/D1, A2/D2, ... An/Dn)。n是关系的度(Degree)
    • 元组(Tuple):关系的一个实例(值),是n个值的有序集合,对应表中的一行。
    • 关系实例(Instance of Relation):关系r是n元组的集合,r = {t1, t2, ..., tm}。
    • 别名:关系也称表(Table),属性也称列(Column),元组也称行(Row)
  • 键(Key)
    • 候选键(Candidate Key):满足以下两个条件的属性集:
      1. 该属性集的值能唯一标识关系中的每个元组。
      2. 该属性集的任何真子集都不能唯一标识元组(最小性)。
    • 超键(Superkey):如果一个属性集能唯一标识关系中的每个元组,但可能不满足最小性,则称为超键。
    • 主键(Primary Key):如果一个关系有多个候选键,数据库管理员(DBA)会选择其中一个作为主键。
    • 备用键(Alternate Key):除主键之外的候选键。
    • 全键(All Key):如果主键包含关系的所有属性,则称为全键。
    • 结论:键能够唯一确定一个元组。
  • 外键(Foreign Key)和参照完整性(Referential Integrity)
    • 外键:一个关系中的属性集,用于“引用”另一个关系中的元组。它必须对应被引用关系的主键。
    • 参照完整性:如果所有外键约束都得到强制执行,则实现了参照完整性,即没有悬空引用(No Dangling References)
    • 用例Enrolled 表中的 sid 是一个外键,它引用 Students 表中的 sid 主键。这意味着只有在 Students 表中存在的学生才能在 Enrolled 表中选课。
  • 其他完整性约束(Other Integrity Constraints)
    • 域完整性约束(Domain Integrity Constraint):属性的值必须在其定义的域内。这是最基本的约束。
    • 实体完整性约束(Entity Integrity Constraint)
      • 每个关系都应该有一个主键。
      • 主键的值必须是唯一的。
      • 主键不能为NULL

2.3.3 关系代数(Relational Algebra)

关系代数是一组对关系进行操作的运算,每个运算都接受一个或多个关系作为输入,并产生一个新的关系作为输出。它是过程化的查询语言。

  • 基本操作
    • 选择(Selection, σ\sigma:从关系中选择满足特定条件的元组(行)。
      • 特点:结果中无重复元组。结果模式与输入关系相同。
      • 用例σrating>8(S)\sigma_{rating > 8}(S) 选取评分大于8的水手。
    • 投影(Projection, π\pi:从关系中删除不需要的属性(列)。
      • 特点:结果中会消除重复元组。结果模式只包含投影列表中的字段。
      • 用例πsname,rating(S)\pi_{sname, rating}(S) 投影水手的姓名和评分。
    • 笛卡尔积(Cross-product, ×\times:将两个关系的所有元组进行组合。
      • 特点:结果模式包含两个输入关系的所有属性。如果属性名冲突,需要重命名。
      • 用例S1×R1S1 \times R1 将S1中的每个水手与R1中的每个预订记录组合。
    • 并(Union, \cup:返回在关系1或关系2中的所有元组。
    • 差(Set-difference, -:返回在关系1中但不在关系2中的所有元组。
    • 交(Intersection, \cap:返回同时在关系1和关系2中的所有元组。
  • 补充操作(可由基本操作推导,但非常有用):
    • 连接(Join)
      • 条件连接(Condition Join, C\bowtie_CRCS=σC(R×S)R \bowtie_C S = \sigma_C(R \times S)。基于特定条件C连接两个关系。
      • 等值连接(Equi-Join):条件连接的特例,条件C只包含等值比较。结果模式与笛卡尔积类似,但只保留一份用于等值比较的属性。
      • 自然连接(Natural Join):在所有公共属性上进行等值连接。结果模式只包含公共属性的一份副本。
    • 除(Division, ÷\div:用于表达“所有”或“全部”这类查询。
      • 定义:A/B 包含所有x元组,使得对于B中的每个y元组,A中都存在一个xy元组。
      • 用例:查找预订了所有船只的水手。
      • 实现:A/B 可以用基本操作表示为 πx(A)πx((πx(A)×B)A)\pi_x(A) - \pi_x((\pi_x(A) \times B) - A)
    • 外连接(Outer Join):在连接操作的基础上,保留未匹配的元组,并用NULL填充空缺。
      • 左外连接(Left Outer Join, * \bowtie:保留左关系的所有元组。
      • 右外连接(Right Outer Join, \bowtie *:保留右关系的所有元组。
      • 全外连接(Full Outer Join, * \bowtie *:保留左右关系的所有元组。
    • 外并(Outer Union):扩展了并操作,可以合并不兼容的关系。结果属性集是两个操作数属性集的并集,缺失属性用NULL填充。

2.3.4 关系演算(Relational Calculus)

关系演算是一种非过程化的查询语言,它只描述查询结果需要满足的逻辑条件,而不指定操作顺序。

  • 两种形式
    • 元组关系演算(Tuple Relational Calculus, TRC):变量范围是元组。
    • 域关系演算(Domain Relational Calculus, DRC):变量范围是域元素(属性值)。
  • 特点:都包含变量、常量、比较运算符、逻辑连接词和量词。是一阶逻辑的简单子集
  • 查询形式
    • DRC{<x1,x2,...,xn>P(x1,x2,...,xn,xn+1,...,xn+m)}\{ <x_1, x_2, ..., x_n> \mid P(x_1, x_2, ..., x_n, x_{n+1}, ..., x_{n+m}) \}
      • x1,...,xnx_1, ..., x_n 是结果中出现的域变量。
      • PP 是一个公式,描述了结果元组需要满足的条件。
    • TRC{t[<attributelist>]P(t)}\{ t[<attribute list>] \mid P(t) \}
      • tt 是元组变量。
      • P(t)P(t) 是一个公式,描述了元组变量 tt 需要满足的条件。
  • 自由变量(Free Variable)和绑定变量(Bound Variable)
    • 量词(\exists\forall)用于绑定变量。
    • 未被绑定的变量称为自由变量。
    • 查询结果左侧的变量必须是公式中唯一的自由变量。
  • 不安全查询(Unsafe Queries):可能产生无限数量答案的查询。
    • 用例{S¬(SSailors)}\{S \mid \neg(S \in Sailors)\} 查找不在Sailors表中的所有S,这可能是无限的。
  • 关系完备性(Relational Completeness)
    • 关系代数的基本操作集 {σ,π,,,×}\{ \sigma, \pi, \cup, -, \times \} 是完备的。
    • 关系演算可以轻松表达这些操作,因此关系演算也是关系完备的。
    • SQL语言基于关系演算,因此可以表达关系代数/演算中可表达的任何查询。

2.3.5 传统数据模型的局限性

  • 主要适用于联机事务处理(OLTP)应用。
  • 基于记录,难以更好地面向用户或应用程序。
  • 无法以自然模式表达实体之间的复杂关系。
  • 缺乏语义信息。
  • 数据类型较少,难以满足复杂应用程序的需求。

3. 概念数据模型

3.1 实体-关系数据模型(ER Data Model)

ER模型是一种概念模型,用于描述现实世界的实体、属性和它们之间的关系,独立于具体的DBMS。

3.1.1 核心概念

  • 实体(Entity):现实世界中可区分的对象。在数据库中通过一组属性来描述。
  • 实体集(Entity Set):相似实体的集合,如所有员工。
    • 实体集中的所有实体具有相同的属性集。
    • 每个实体集都有一个键(Key)
    • 每个属性都有一个域(Domain)
    • 允许组合属性(Combined Attribute)或多值属性(Multi-valued Attribute)。
  • 关系(Relationship):两个或多个实体之间的关联。
    • 关系也可以有属性。
  • 关系集(Relationship Set):相似关系的集合。
    • 一个n元关系集R关联n个实体集E1... En。
    • 同一个实体集可以参与不同的关系集,或在同一个关系集中扮演不同的“角色”。

3.1.2 ER图(ER Diagram)

ER图是ER模型的图形表示,使用特定图例来表示实体、关系和属性。

  • 图例
    • 实体:矩形
    • 关系:菱形
    • 属性:椭圆形

3.1.3 基数比约束(Cardinality Ratio Constraints)

描述关系集中实体参与的数量限制。

  • 1:1:一个实体最多与另一个实体的一个实例相关联。
  • 1:N:一个实体可以与另一个实体的多个实例相关联,但另一个实体只能与该实体的一个实例相关联。
  • M:N:一个实体可以与另一个实体的多个实例相关联,另一个实体也可以与该实体的多个实例相关联。

3.1.4 参与约束(Participation Constraints)

指定一个实体参与某个关系的最小和最大次数。

  • 完全参与(Total Participation):实体集中的所有实体都必须参与该关系。
    • 用例:如果每个部门都必须有一个经理,则部门实体集在“管理”关系中是完全参与的。
  • 部分参与(Partial Participation):实体集中的部分实体可以不参与该关系。
  • 参与度(Participating Degree):用 (min, max) 表示实体参与关系的最小和最大次数。
    • 用例:如果每个学生必须选至少3门课,最多6门课,则学生的参与度为 (3,6)。

3.1.5 ER模型的高级主题

  • 弱实体(Weak Entity):其存在依赖于另一个实体(强实体)的实体。
  • 特化(Specialization)和泛化(Generalization):类似于面向对象数据模型中的继承。
  • 聚合(Aggregation):允许将一个关系集视为一个实体集,以便其可以参与其他关系。
  • 范畴(Category):允许表达一个实体集由不同类型的实体组成,即混合实体集。

4. 其他数据模型

4.1 面向对象数据模型(Object-Oriented Data Model)

旨在弥补关系数据模型的不足,支持更复杂的数据类型和行为。

  • 突破1NF:允许属性值是非原子的。
  • 面向对象分析和编程:与面向对象范式紧密结合。
  • 对象持久化存储:支持对象的长期存储。
  • 对象-关系DBMS(Object-Relational DBMS):在关系模型基础上增加面向对象特性。
  • 纯面向对象DBMS(Native Object-Oriented DBMS):完全基于面向对象概念构建。

4.2 其他数据模型

  • 基于逻辑的数据模型(Logic-based Data Model / Deductive DBMS)
    • 扩展DBMS的查询功能(特别是递归查询)。
    • 提升DBMS的演绎能力。
  • 时态数据模型(Temporal Data Model):处理带有时间戳的数据。
  • 空间数据模型(Spatial Data Model):处理地理空间数据。
  • XML数据模型(XML Data Model)
    • 互联网数据存储和交换标准。
    • 信息系统集成。
    • 半结构化数据表达。
  • 其他:如图数据模型、文档数据模型等。

5. 总结

数据模型是DBMS的核心,它定义了数据在数据库中的组织方式和操作方法。从早期的层次模型和网状模型,到目前主流的关系模型,再到面向对象模型和其他新兴模型,数据模型不断演进以更好地模拟现实世界并满足日益复杂的应用需求。关系模型以其坚实的数学基础和简洁的表结构占据主导地位,但随着大数据和复杂数据类型的兴起,新的数据模型也在不断发展。